package com.bright.ghj.overt.service;

import com.bright.ghj.common.pojo.vo.PageVO;
import com.bright.ghj.overt.pojo.dto.AsyncMessageDTO;
import com.bright.ghj.overt.pojo.query.AsyncTaskMassageQuery;
import com.bright.ghj.overt.pojo.vo.AsyncMessageVO;
import com.bright.ghj.overt.pojo.vo.AsyncTaskExecInfoResultVO;
import com.bright.ghj.overt.pojo.vo.AsyncTaskResultVO;
import com.bright.ghj.overt.service.impl.AsyncMessageServiceImpl;
import com.bright.ghj.overt.task.timely.AsyncTaskExecutor;

import java.util.List;

/**
 * @author Tz
 * @date 2024/01/22 15:03
 * @Description 异步任务消息接口 额外提供可以提交异步执行任务的功能
 */
public interface AsyncMessageService {

    /**
     * 保存异步任务消息
     * @param asyncMessageDTO 异步任务消息DTO
     * @return                异步任务消息DTO
     */
    AsyncMessageDTO save(AsyncMessageDTO asyncMessageDTO);

    /**
     * 根据id查询异步任务消息
     * @param id 主键
     * @return   异步任务消息DTO
     */
    AsyncMessageDTO getById(Integer id);

    /**
     * 通用的提交执行异步任务
     * <p>
     * 会提交实现 {@link AsyncTaskExecutor#baseExec()} 方法中的任务内容,
     * 实际执行的是子类的 {@link AsyncTaskExecutor#taskContent()}
     * @param asyncTaskExecutor  需要执行的异步任务内容
     * @return                   执行生成的结果
     */
    AsyncTaskResultVO execAsyncTask(AsyncTaskExecutor asyncTaskExecutor);

    /**
     * 根据主键标识获取异步任务的进度
     * <p>
     * 当项目重启 如果获取历史执行任务的进度会报错 直接返回100
     * <p>
     * 添加一个可以自动清理已经完成任务的功能 避免一直占用内存 {@link AsyncMessageServiceImpl#cleanAsyncTaskTimer()}
     * @param keyword 主键标识
     * @return        进度百分比
     */
    Integer getCompletionDegree(String keyword);

    /**
     * 根据id撤回发送的异步任务
     * @param id 主键
     * @return   返回撤回的数量
     */
    Integer revokeAsyncTask(Integer id);

    /**
     * 根据条件获取异步任务消息列表
     * @param asyncTaskMassageQuery 查询条件
     * @return                      异步消息列表
     */
    PageVO<AsyncMessageVO> pageAsyncMessage(AsyncTaskMassageQuery asyncTaskMassageQuery);

    /**
     * 根据keyword集合查询异步消息列表
     * @param keywords keyword集合
     * @return         异步消息列表
     */
    List<AsyncMessageVO> listAsyncMessageByKeywords(List<String> keywords);

    /**
     * 一键已读
     *
     * @param statusCategory 需要已读的状态类别
     * @param username       需要已读的用户
     * @return 已读记录数
     */
    Integer oneClickRead(Integer statusCategory, String username);

    /**
     * 阅读一条未读消息
     * @param id 主键
     * @return   读取结果
     */
    Integer read(Integer id);

    /**
     * 获取异步任务执行的情况结果
     * @param username  执行任务的用户名
     * @return          异步任务的执行情况结果的VO
     */
    AsyncTaskExecInfoResultVO getAsyncTaskExecInfo(String username);

    /**
     * 确认读取执行的结果
     * @param username 执行任务的用户名
     */
    void confirmReadingExecResult(String username);
}
